home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok56
/
intas
/
intoas-txt
/
intas.mod
next >
Wrap
Text File
|
1993-11-04
|
9KB
|
347 lines
(*********************************************************************
*
* :Program. IntAS
* :Author. Hans Schafft
* :Address. Landfriedstraße 1A - Hinterhaus
* :Address. 6900 Heidelberg
* :Phone. 06221 - 22416
* :Version. 1.0
* :Date. 1991
* :Copyright. PD
* :Language. Modula-II
* :Translator. M2Amiga 4.0
* :Contents.
*
*********************************************************************)
(***************************************************************)
(* Das Modul wandelt INLINE - Code von M2Amiga 1.x in ASSEMBLE *)
(* Anweisungen für M2Amiga 4.0. Außerdem korrigiert es die IM- *)
(* PORT - Anweisungen und ändert die Anweisung '(*$E-*)' um in *)
(* '(* $EntryExitCode := FALSE *)' Beginn Juni 1991 *)
(***************************************************************)
MODULE INtAS;
FROM Terminal IMPORT ReadLn;
FROM Arguments IMPORT GetArg, NumArgs;
FROM InOut IMPORT done,termCh,SetInput,SetOutput,CloseInput,
WriteString,Write,Read,WriteLn,
CloseOutput,ReadString;
FROM Arts IMPORT Assert,Terminate;
FROM SYSTEM IMPORT ADR;
FROM ASCII IMPORT eof,eol,ht;
FROM String IMPORT Length,Copy,Occurs,Concat,Compare,first,last,
Delete,Insert,CopyPart;
CONST SchluesselWortGroesse = 5;
VAR leer,name,strIn,rest : ARRAY [0..199] OF CHAR;
lenIn,len : INTEGER;
mindestensZweitesWort : BOOLEAN;
(****************************************************************************)
(* LiesZeileEin in strIn, und gibt TRUE zurück, wenn LetzeZeile sonst FALSE *)
(****************************************************************************)
PROCEDURE ReadLine() : BOOLEAN;
BEGIN
(* strIn initialisieren *)
FOR lenIn := 0 TO 199 DO
strIn[lenIn] := 0C;
END;
lenIn := 0;
REPEAT
Read(strIn[lenIn]);
INC(lenIn);
Assert(lenIn < 199,ADR("Zu lange Zeile !"));
UNTIL (strIn[lenIn - 1] = eol) OR (strIn[lenIn - 1] = eof);
IF (strIn[lenIn - 1] = eof) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END ReadLine;
(*****************************************************************************)
(* ersetzt in einem String 'str' durch 'ersatz' und gibt das erste Vorkommen *)
(* von 'str' zurück; kam 'str' nicht vor,wird 'last' zurückgegeben *)
(*****************************************************************************)
PROCEDURE strInModifizieren(str,ersatz : ARRAY OF CHAR) : INTEGER;
VAR occ,strLen : INTEGER;
BEGIN
strLen := Length(str);
occ := Occurs(strIn,0,str,TRUE);
(* Ändere ggf. strIn und lenIn *)
IF occ # last THEN
CopyPart(rest,strIn,0,occ);
Concat(rest,ersatz);
CopyPart(name,strIn,occ+strLen,lenIn-occ-strLen);
Concat(rest,name);
Copy(strIn,rest);
END;
lenIn := Length(strIn);
RETURN occ;
END strInModifizieren;
(************************************************************)
(* Übersetzt die einzelnen Worte eines übergebenen Strings *)
(************************************************************)
PROCEDURE UebersetzeUndGibAusWort(wort : ARRAY OF CHAR; laenge : INTEGER);
VAR a : INTEGER;
BEGIN
IF mindestensZweitesWort THEN
WriteString(", ");
END;
IF wort[laenge-1] = "H" THEN
Write("$");
ELSIF wort[laenge-1] = "B" THEN
Write("@");
ELSIF wort[laenge-1] = "L" THEN
Write("%");
ELSE (* DezimalZahl *)
WriteString(wort);
END;
FOR a := 1 TO laenge-2 DO
Write(wort[a]);
END;
mindestensZweitesWort := TRUE;
END UebersetzeUndGibAusWort;
(************************************************************)
(* bereitet die übersetztung einer Zeile vor *)
(************************************************************)
PROCEDURE UebersetzeZeile(VAR str : ARRAY OF CHAR) : BOOLEAN;
VAR len,a,b : INTEGER;
ende : BOOLEAN;
wort : ARRAY [0..7] OF CHAR;
BEGIN
len := Length(str);
(* ----------------------------------------------- *)
(* Lies Block bis Komma oder abschließender Klammer *)
(* ----------------------------------------------- *)
a := 0;
WHILE a < len DO
ende := FALSE;
(* Leerzeichen und Tabs überlesen *)
WHILE (str[a] < "0") AND (a < len) DO
IF str[a] = ")" THEN
ende := TRUE;
END;
INC(a);
END;
IF NOT ende THEN
(* Array 'wort' säubern *)
FOR b := 0 TO 7 DO
wort[b] := 0C;
END;
(* alles was ziffer oder Buchstabe ist nach wort einlesen *)
(* bis ein Komma, leerzeichen, KlammerZu o.ä. erscheint *)
b := 0;
WHILE (str[a] >= "0") AND (a < len) DO
wort[b] := str[a];
INC(a);INC(b);
END;
IF b > 1 THEN
UebersetzeUndGibAusWort(wort,b);
END;
ELSE
WriteString("\n END);");
RETURN TRUE;
END;
END; (* WHILE a < len DO *)
RETURN ende;
END UebersetzeZeile;
(***********************************************************)
(* wandelt wortweise organisierte Daten ins neu Format um *)
(***********************************************************)
PROCEDURE WandleDaten(x : INTEGER);
VAR ok,fertig : BOOLEAN;
BEGIN
(* strIn bis position x ausgeben *)
FOR len := 0 TO x-1 DO
Write(strIn[len]);
END;
Write(" ");
Delete(strIn,0,x); (* Schon geschriebenes aus strIn löschen *)
lenIn := Length(strIn);
(* --------------------------------------------------------- *)
(* Daten, die ab strIn[0] stehen wandeln und direkt schreiben *)
(* Lies Block bis Komma oder abschließender Klammer *)
(* ----------------------------------------------- *)
mindestensZweitesWort := FALSE;
fertig := UebersetzeZeile(strIn);WriteLn;
WHILE NOT fertig DO
Write(ht);
ok := ReadLine();
fertig := UebersetzeZeile(strIn);
WriteLn;
END;
FOR lenIn := 0 TO 199 DO
strIn[lenIn] := 0C;
END;
END WandleDaten;
(*******************************)
(* eigentliches Hauptprogramm *)
(*******************************)
PROCEDURE Umwandeln;
VAR letzteZeile,wandle : BOOLEAN;
occ,x : INTEGER;
BEGIN
REPEAT
(* LiesZeileEin in strIn *)
letzteZeile := ReadLine();
(* wenn Zeile kleiner als SchluesselWortGroesse -> sofort wieder ausgeben *)
IF lenIn > SchluesselWortGroesse THEN
(* Untersuche auf das Schlüsselwort (*$E-*) + ändere*)
occ := strInModifizieren("(*$E-*)"," (*$EntryExitCode := FALSE *)");
(* Untersuche auf das Schlüsselwort (*$C+*) + lösche *)
occ := strInModifizieren("(*$C+*)"," ");
(* Untersuche auf das Schlüsselwort Str *)
occ := strInModifizieren("Str","String");
(* Untersuche auf das Schlüsselwort Strings *)
occ := strInModifizieren("Strings","String");
(* Untersuche auf das Schlüsselwort INLINE *)
occ := strInModifizieren("INLINE","ASSEMBLE");
(* wurde 'INLINE' ersetzt ? wenn ja -> nächstes Zeichen holen *)
IF occ # last THEN
INC(occ,7);
wandle := FALSE;
WHILE occ <= lenIn DO (* VORAUSSETZUNG: INLINE und die *)
IF strIn[occ] = "(" THEN (* KlammerAuf stehen in einer Zeile ! *)
wandle := TRUE; (* ---------------------------------- *)
x := occ + 1;
END;
INC(occ);
END;
(* -------------------------------------------------------------- *)
(* wenn '(' -> CodeLesen-Umwandeln-Ausgeben bis ')' gefunden wird, *)
(* dann dafür 'END);' einsetzen *)
(* --------------------------- *)
IF wandle THEN
Insert(strIn,x,"DC.W ");
WandleDaten(x + 5); (* ab da könnten Daten sein *)
END;
END;
END;
WriteString(strIn);
UNTIL letzteZeile;
END Umwandeln;
(***************************************************************)
PROCEDURE OeffneDateien;
VAR name2 : ARRAY [0..199] OF CHAR;
BEGIN
Copy(name2,name);
Concat(name2,"-4.0");
WriteString("\n\tErzeugt wird die Datei ");
WriteString(name2);WriteLn;WriteLn;
SetInput(name);
Assert(done,ADR("LeseDatei nicht zu öffnen"));
SetOutput(name2);
Assert(done,ADR("AusgabeDatei nicht zu öffnen"));
END OeffneDateien;
(***************************************************************)
PROCEDURE GebrauchsAnleitung;
BEGIN
WriteString("\n\tusage : INtAS [Datei] (c) H.Schafft '91\n");
WriteString("\n\terzeugt wird die Datei '[datei]-4.0'\n\n");
Terminate;
END GebrauchsAnleitung;
(***************************************************************)
PROCEDURE LiesArgumente;
VAR len : INTEGER;
BEGIN
IF NumArgs() = 1 THEN
GetArg(1,name,len);
IF name[0] = "?" THEN
GebrauchsAnleitung;
ELSE
OeffneDateien;
END;
ELSE
WriteString("\n\tName der Datei : ");ReadLn(name,len);
OeffneDateien;
END;
END LiesArgumente;
(***************************************************************)
(* MAIN *)
(***************************************************************)
BEGIN
LiesArgumente;
Umwandeln;
CLOSE
CloseOutput;
CloseInput;
END INtAS.